package top.tomxwd.mybatis.demo;

import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import top.tomxwd.mybatis.entity.User;
import top.tomxwd.mybatis.mapper.UserMapper;

import java.io.IOException;
import java.io.InputStream;

/**
 * @author 风风
 * mybatis测试类
 */
public class MybatisMain {

    public static void main(String[] args) throws IOException {

        String resource = "top\\tomxwd\\mybatis\\mybatis-config.xml";
        // 通过mybatis的资源类Resources读入“mybatis-config.xml”文件;
        InputStream inputStream = Resources.getResourceAsStream(resource);
        // 使用SqlSessionFactoryBuilder类生成我们需要的SqlSessionFactory类；（真正的解析只有这一过程）
        SqlSessionFactoryBuilder sqlSessionFactoryBuilder = new SqlSessionFactoryBuilder();
        // SqlSessionFactory
        /*
            要理解配置文件的解析过程， 首先要明白解析的目的是什么，
            从最直观的调用代码来看， 是获得SqlSessionFactory。

            但是， 从源代码来看， 更本质的应该这么说：

            mybatis解析配置文件最本质的目的是为了获得Configuration对象

            Configuration 对象， 可以理解是mybatis的XML文件在程序中的化身。
            ---------------------------------------------------------
            sqlSessionFactoryBuilder.build(inputStream)
              ===》
            其中的build()方法，其实就是将配置文件中的数据源信息和xxxMapper.xml的sql语句封装成了Configuration对象

         */
        SqlSessionFactory sqlSessionFactory = sqlSessionFactoryBuilder.build(inputStream);
        // SqlSession ==》 这一步其实什么都没干，只是单纯的创建了一个执行器Executor
        SqlSession sqlSession = sqlSessionFactory.openSession();


        // 最后一步骤，是干活的地方。。。。
        // todo 方式一 : 获取到xxxMapper的代理类（sqlSession.getMapper(UserMapper.class)），通过类调用方法
//        UserMapper mapper = sqlSession.getMapper(UserMapper.class);
//        User user = mapper.selectById("1");

        // todo 方式二 : sqlSession.selectOne("namespace + id","sql语句需要的参数")
        // 参数一（statement）：namespace + id，
        // 参数二（parameter）：sql语句需要传递的参数
        User user = sqlSession.selectOne("top.tomxwd.mybatis.mapper.UserMapper.selectById", "1");
        System.out.println(user);
    }
}
